package com.zjj.learn.designmodel.work.builder;

public class BuilderTest {

    public static void main(String[] args) {
        //创建一个生产摩派的指挥者
        Director director = new Director(new MopaiBuilder());
        //指挥者生产自行车
        Bike bike = director.construct();

    }

    /**
     * 建造者模式（Builder Pattern）是一种创建型设计模式，通过将对象构造和表示分离，可以使同样的构建过程可以创建不同的表现形式。
     *
     * 在建造者模式中，定义一个Director（指挥者）对象，其职责是按照一定的顺序调用Builder对象来构建最终的对象。
     * 而Builder（建造者）对象则负责实际构建对象的各个部分，对外隐藏了具体的实现细节。
     * 同时， Builder 将返回构建的对象给 Director 使用。
     *
     * 建造者模式的使用
     *    建造者模式的组成部分：
     *        1、抽象建造者（Builder）：接口或者抽象类，目的是实现复杂对象有哪些部分需要进行建造，不提供建造细节
     *        2、具体建造者：抽象建造者的实现类，将抽象建造者里面的方法具体化
     *        3、产品：需要生产的东西
     *        4、指挥者（Director）：调用具体建造者完成各个部分
     *
     * 实现功能：
     *    使用建造者模式，实现自行车的构建，制造 Ofo 和 Mopai 两种自行车，主要构建 车轮和车座
     *    需要的类：
     *      1、Bike：自行车，有 名字、车座和车轮三个属性
     *      2、Builder：抽象建造者，提供造车轮和造车座两个抽象方法
     *      3、OfoBuilder：
     *      4、MopaiBuilder：
     *      5、Director：指挥者，将 Builder 聚合进来了，提供 造车方法
     *
     * 具体实现请见：{@link com.zjj.learn.designmodel.work.builder}
     *
     * 建造者模式定义了一个创建对象的标准接口，可以为不同的具体构建对象实现提供灵活性和扩展性。
     * 当需要生产不同种类、不同风格的对象时，可以方便地创建多个Builder，并由Director来控制Build出符合需求的对象,
     * 同时又隐藏了复杂的实现细节，使得代码更加易读易维护。
     *
     **/



    /**
     * 建造者模式和工厂方法模式的区别：
     *
     *    工厂方法模式和建造者模式都是创建型设计模式，但它们解决的问题略有不同：
     *
     *    在工厂方法中主要看中产品的整体创建，一般不考虑创建的各个部分细节；
     *    建造者模式一般用于对复杂产品的创建，可以进行分步骤详细创建；
     *
     *
     *
     * 工厂方法模式（Factory Method Pattern）用于创建一些简单对象，而且通常只需要一步就可以创建完成。
     * 通过定义一个工厂接口和多个实现类，每个工厂实现类负责创建自己所对应的产品类型。
     *
     * 有关工厂方法模式详细情况请见：
     * 建造者模式（Builder Pattern）则更适用于创建复杂对象，例如需要一步步构建或者配置许多不同的组成部分才能完成的对象。
     * 它通过将对象构造和表示分离来实现目标，并提供灵活的方式使得同样的构建过程可以创建不同的表现形式。
     *
     * 有关建造者模式详细情况请见：
     *
     * 因此，二者的主要区别在于：
     *  1、对象复杂度不同：工厂方法模式用于创建简单对象，而建造者模式用于创建相对复杂的对象；
     *  2、过程不同：工厂方法模式通常只需要一步就可以创建完成，而建造者模式会分成多个步骤、多次操作来构建一个完整的对象，增加了可定制性和灵活性；
     *  3、结构不同：工厂方法模式是选择性地隐藏了对象创建的细节，通过向用户暴露工厂接口来创建对象；
     *             而建造者模式则直接将对象构造和表示分开，隔离了对象的创建和使用。
     *
     *   例如：当我们要考虑生产一个超人；
     *     若使用工厂方法，一般将生产超人和生产机器人放在一起比较，我们提供生产超人的工厂就可以将超人生产出来了；
     *     若使用建造者模式考虑，就是将超人分成头、手、脚等等部分生产好，然后进行组装好。最后穿上内裤就可以了，在这个过程中就需要一个指挥者了，用于指定生产顺序
     *
     **/
}
